#include <iostream>
using namespace std;
//验证一下虚表在内存中的哪个位置
//思路，分别定义一个地址由低到高的代码段，数据段，堆，栈上的变量，然后
//比较一下哪个跟虚表的地址比较接近
class A{
public:
    virtual 
        void print(){
            cout<<"A::print()"<<endl;
        }
};
class B:public A{
public:
    void print(){
        cout<<"B::print()"<<endl;
    }
};
//定义一个全局变量，这个变量存在数据段
long num1=10;
void test(){
    cout<<"数据段:"<<&num1<<endl;
    //定义一个局部的变量,这个变量存在栈上
    long num2=20;
    cout<<"栈"<<&num2<<endl;
    //定义一个在堆上的变量
    long* num3=new long();
    *num3=30;
    cout<<"堆:"<<num3<<endl;
    //定义一个在代码段的变量
    long const num4=40;
    cout<<"代码段:"<<&num4<<endl;
    //找到虚表的内存地址
    A a;
    A* pa=&a;
    //此时的pl就是这个对象的指针，但是这个指针只能操纵前8个字节
    //前八个字节就是指向虚表的指针，这个指针是在栈区的，要通过解引用
    //来获得虚表的地址
    long *pl=(long*)pa;
    long *vtable=(long*)*pl;
    cout<<"虚表的内存地址:";
    cout<<vtable<<endl;
    delete num3;
}
int main(int argc, char * argv[]){
    test();
    return 0;
}

